import CryptoJS from "crypto-js"

/*
    DES(Data Encryption Standard)和TripleDES是对称加密的两种实现。
    DES和TripleDES基本算法一致，只是TripleDES算法提供的key位数更多，加密可靠性更高。
    DES使用的密钥key为8字节，初始向量IV也是8字节。
    TripleDES使用24字节的key，初始向量IV也是8字节。
*/

function des_encrypt(message, keyvi, student_id) {
	const {
		key,
		iv
	} = getQuestionDesKey(keyvi, student_id);
	let crypto_key = CryptoJS.enc.Utf8.parse(key);
	let crypto_iv = CryptoJS.enc.Utf8.parse(iv.substr(0, 8));

	let encode_str = CryptoJS.TripleDES.encrypt(message, crypto_key, {
		iv: crypto_iv,
		mode: CryptoJS.mode.CBC,
		padding: CryptoJS.pad.Pkcs7
	});
	return encode_str.toString();

}

function getQuestionDesKey(token, student_id) {
	let tokenList = token.split('.');
	let message = tokenList[tokenList.length - 1];
	let pos = student_id % 8; // 密钥  7
	let key = message.slice(pos, pos+8);
	let ivEndPos = message.length - pos;
	let iv = message.slice(ivEndPos - 8, ivEndPos);
	return {
		key,
		iv
	};
};
//des解密 DES-EDE3-CBC
function des_decrypt(message,token,student_id) {
	if(!message) return message;
	const {
		key,
		iv
	} = getQuestionDesKey(token,student_id);
	const crypto_key = CryptoJS.enc.Utf8.parse(key); // key
	const crypto_iv = CryptoJS.enc.Utf8.parse(iv); // iv
	let decrypt_str = CryptoJS.TripleDES.decrypt(message, crypto_key, {
		iv: crypto_iv,
		mode: CryptoJS.mode.CBC,
		padding: CryptoJS.pad.Pkcs7
	});
	return decrypt_str.toString(CryptoJS.enc.Utf8);
}


module.exports = {
	des_encrypt: des_encrypt,
	des_decrypt: des_decrypt
}